中文翻譯為類別,什麼是類別呢?
以生活中的例子來說,人是一個類別,車是一個類別,但類別是一個很抽象的詞。
就人來說,具有一顆頭、兩隻手、兩隻腳、會跑會跳會說話,再具體化一點,你、我就是「人」這個類別的實體,你有一顆頭與四肢,我也有這些特徵。除了人類之外還有狗、鳥、昆蟲等,這些我們統稱為動物,其特徵是會呼吸,就像生物分類法(界、門、綱、目、科、屬、種)的概念。所以可以在動物這個類別定義一個方法是呼吸,而後的人、狗、鳥等等透過繼承動物的呼吸方法,人、狗、鳥都會呼吸了,這樣的好處是不必在定義人、狗、鳥時重複寫呼吸的方法,只要針對這些類別不同之處去寫特定的方法就可以,像是人會說話、狗會吠叫、鳥會飛。
換成車子呢,一個引擎、四顆輪子、會跑,具體的例子可以是 Ferrari 跑車、Jeep 越野車、Lexus 休旅車,這些有共同的狀態和行為。除了車子,還有飛機、船、腳踏車等等交通工具,交通工具的最大特點就是會移動,所以我們先來定義交通工具這個類別:
※小提醒:定義類別要使用常數 ( 首字為大寫字母 )。
class Transportation
def move
puts "Moving!"
end
end
然後車子、飛機等繼承自交通工具,所以也得到move這個方法:
class Car < Transportation
end
class Airplane < Transportation
end
class Boat < Transportation
end
接下來先定義車這個類別,可以帶入品牌和類型兩個參數,並且用new
這個方法產生實體。
假設小明買了一台黑色的lexus休旅車,並將愛車取名為大黑。買車後就要上路啦,呼叫run方法,讓車子動起來!
class Car < Transportation
def initialize(brand, type)
@brand = brand
@type = type
end
def run(name)
puts "#{name} is running on the road"
end
end
my_car = Car.new("posh", "sportcar")
my_car.run('大黑')
# 印出 大黑 is running on the road.
有車還是不能滿足小明的慾望,覺得車子只會在路上跑很無趣,望向天空,有一架飛機飛過頭頂,小明有個大膽的想法,希望大黑可以像飛機一樣在天上飛,於是用繼承的方式讓大黑也可以飛起來:
class Airplane
def fly(name)
puts "#{name} is flying in the sky."
end
end
airbus = Airplane.new
airbus.fly('榮榮1380')
# 印出 榮榮1380 is flying in the sky.
class Car < Airplan
# 略...
end
my_car.fly('大黑')
# 印出 大黑 is flying in the sky.
看到這裡不會覺得很奇怪嗎?小明為了讓車子飛起來就繼承飛機的功能,就像狗狗為了想要飛,就去當小鳥的孩子一樣,這樣是不對的,所以接下來要講 Module 的精隨。
如果把 class 比喻成用樂高疊出來的物件,那 Module 就像是積木,一塊塊積木代表著 method,需要的人可以拿去組在自己的本體上。這樣就不用為了功能而去當別人的小孩。
首先把fly功能拿出來寫成一個積木,這塊積木就取名為Flyable:
※小提醒:定義模組跟類別一樣要使用常數 ( 首字為大寫字母 )。
module Flyable
def fly(name)
puts "#{name} can fly!"
end
end
如果車子也想會飛 (也許未來每個人真的都有一台榮恩家的車) ,那車子這個類別就可以把飛行的積木拿去組在自己身上,組裝的方式是用include
:
class Car
include Flyable
def run(name)
puts "#{name} is running on the road."
end
end
現在讓車子跑起來、也飛起來吧~
my_car = Car.new
my_car.run('大黑')
my_car.fly('大黑')
# 執行結果
# 大黑 is running on the road.
# 大黑 can fly!
參考資料:
為你自己學Ruby on Rails
學無止盡,每天都要進步一點點!